package conf

import (
	"context"
	"fmt"

	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"gopkg.in/ini.v1"

	// 日志包
	logging "github.com/sirupsen/logrus"
	// 导入自己写的包
	"chat/cache"
	"chat/model"
)

// 定义conf.init中获取的参数
var (
	MongoDBClient *mongo.Client
	AppMode       string
	HttpPort      string
	Db            string
	DbHost        string
	DbPort        string
	DbUser        string
	DbPassword    string
	DbName        string
	RedisDb       string
	RedisAddr     string
	RedisPw       string
	RedisDbName   string
	MongoDBName   string
	MongoDBAddr   string
	MongoDBPwd    string
	MongoDBPort   string
)

// 构造初始化函数
func Init() {
	// 从本地读取配置项---通过官方的ini.v1包实现
	file, err := ini.Load("./conf/conf.init")
	if err != nil {
		fmt.Println("ini load failed", err)
	}
	// 加载对应数据库配置
	LoadServer(file)
	LoadMySQL(file)
	LoadMongoDB(file)
	// mongdb连接
	MongoDB()
	// 按照要求格式传递连接字符串即可
	// connString: root:root@tcp(127.0.0.1:3306)/gorm?
	connString := fmt.Sprintf(
		"%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s",
		DbUser,
		DbPassword,
		DbHost,
		DbPort,
		DbName,
		"10s",
	)
	// mysql连接
	model.Database(connString)
	// mysql自动创建表和迁移数据表结构
	err = model.DB.AutoMigrate(&model.User{})
	if err != nil {
		logging.Info("数据库迁移表失败", err)
	}
	logging.Info("数据库迁移表成功")
	// redis链接
	cache.Init()
}

func MongoDB() {
	// 创建链接
	clientOptions := options.Client().ApplyURI("mongodb://" + MongoDBAddr + ":" + MongoDBPort)
	var err error
	// context.TODO()
	/**
	使用 `context.TODO()` 函数的常见情况是在编写函数或方法时，
	需要传递 `Context` 参数，但当前还没有明确确定要使用的上下文类型。
	在这种情况下，可以使用 `context.TODO()` 作为一个临时的占位符，
	以后再根据实际情况确定要使用的具体上下文类型。
	*/
	MongoDBClient, err = mongo.Connect(context.TODO(), clientOptions)
	if err != nil {
		logging.Info(err)
		panic(err)
	}
	logging.Info("MongoDB连接成功")
}

func LoadServer(file *ini.File) {
	AppMode = file.Section("service").Key("AppMode").String()
	HttpPort = file.Section("service").Key("HttpPort").String()
}

func LoadMySQL(file *ini.File) {
	Db = file.Section("mysql").Key("Db").String()
	DbHost = file.Section("mysql").Key("DbHost").String()
	DbPort = file.Section("mysql").Key("DbPort").String()
	DbUser = file.Section("mysql").Key("DbUser").String()
	DbPassword = file.Section("mysql").Key("DbPassword").String()
	DbName = file.Section("mysql").Key("DbName").String()
}

func LoadMongoDB(file *ini.File) {
	MongoDBName = file.Section("MongoDB").Key("MongoDBName").String()
	MongoDBAddr = file.Section("MongoDB").Key("MongoDBAddr").String()
	MongoDBPwd = file.Section("MongoDB").Key("MongoDBPwd").String()
	MongoDBPort = file.Section("MongoDB").Key("MongoDBPort").String()
}
